package com.lfy.modules.disk.service;

import com.lfy.modules.common.domain.R;
import com.lfy.modules.common.domain.entity.UserEntity;
import com.lfy.modules.disk.domain.dto.CreateFolderDTO;
import com.lfy.modules.disk.domain.dto.ReNameDTO;
import com.lfy.modules.disk.domain.dto.ShareDTO;
import com.lfy.modules.common.domain.FileUrlVO;
import com.lfy.modules.disk.domain.vo.FileVO;
import com.lfy.modules.disk.domain.vo.ShareFilePwdVO;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 *  网盘service
 *
 * @author <a href="https://www.lvfeiy.top">lvfeiyang</a>
 * @date 2024/5/28 16:37
 */
public interface DiskService {
    /**
     * 上传小文件
     * @param file 文件
     * @param user 用户
     * @return 上传结果
     */
    R<Void> uploadSmallFile(MultipartFile file, UserEntity user,Long parentId,Integer type);

    /**
     * 删除分片文件
     */
    void deleteChunkFile();

    /**
     * 创建文件夹
     * @param  dto 创建文件夹参数
     * @param user 用户
     * @return 创建结果
     */
    R<Void> createFolder(CreateFolderDTO dto, UserEntity user);

    /**
     * 获取文件列表
     * @param parentId 父目录ID
     * @param user 用户
     * @return 文件列表
     */
    R<List<FileVO>> getFileListByParentId(Long parentId, UserEntity user);

    /**
     * 重命名文件或文件夹
     * @param dto 重命名参数
     * @param user 用户
     * @return 重命名结果
     */
    R<Void> rename(ReNameDTO dto, UserEntity user);

    /**
     * 删除文件
     * @param id 文件ID
     * @param user 用户
     * @return 删除结果
     */
    R<Void> deleteFile(Long id, UserEntity user);

    /**
     * 秒传、判断文件是否存在
     * @param md5 文件md5
     * @return 文件是否存在
     */
    R<Boolean> exist(String md5,String fileName,Long parentId);

    /**
     * 分片、校验分片是否存在
     * @param md5 文件md5
     * @param chunk 分片index
     * @return 分片是否存在
     */
    R<Boolean> checkChunk(String md5, Integer chunk);

    /**
     * 上传分片文件
     * @param file 文件
     * @param md5 文件md5
     * @param chunk 分片index
     * @param user 用户
     * @return 上传结果
     */
    R<Void> uploadChunk(MultipartFile file, String md5, Integer chunk, UserEntity user);

    /**
     * 合并分片文件
     * @param md5 文件md5
     * @param fileName 文件名
     * @param parentId 父目录ID
     * @param user 用户
     * @param cutSize 切割大小
     * @param type 文件类型
     * @return 合并结果
     */
    R<Void> merge(String md5, String fileName, Long parentId, UserEntity user, Integer cutSize, Integer type,Double fileSize);

    /**
     * 下载文件
     * @param id 文件ID
     * @param user 用户
     * @return 下载结果
     */
    ResponseEntity<byte[]> download(Long id, UserEntity user, HttpServletResponse response);

    /**
     * 下载文件到流
     * @param id 文件ID
     * @param user 用户
     * @param response 响应
     */
    void downloadToStream(Long id, UserEntity user, HttpServletResponse response);
    /**
     * 剪切文件到指定目录
     * @param id 文件ID
     * @param parentId 目标目录ID
     * @param user 用户
     * @return 剪切结果
     */
    R<Void> paste(Long id, Long parentId, UserEntity user);


    /**
     * 分享文件 获取分享链接
     * @param shareDTO 分享参数
     * @param user 用户
     * @return 分享链接
     */
    R<ShareFilePwdVO> createShareFile(ShareDTO shareDTO, UserEntity user);
}
